/*
 * VerFacturas.java
 *
 * Created on 24 de marzo de 2006, 09:48 AM
 */
//lbl_total
package administrador;

import java.awt.image.BufferedImage;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.awt.*;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import javax.swing.table.*;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 *
 * @author User
 */
public class VerFacturas extends javax.swing.JFrame {

    JTable tabla;
    Conexion conexion;
    JScrollPane js;
    int bodega;
    String usuario;
    Usuario user;
    //Representa el nivel actual si es  Detalle(0) Dias(1) Meses(2) Anos(3)
    int Nivel;
    //Nath Redondeo
    NumberFormat nf = NumberFormat.getNumberInstance();

    public VerFacturas(Conexion c, int BEnt, Usuario user) {

        DecimalFormat dec = (DecimalFormat) nf;
        dec.applyPattern("###.##");//Configuro Redondeo
        nf.setMaximumFractionDigits(2);
        nf.setRoundingMode(RoundingMode.HALF_UP);


        bodega = BEnt;
        conexion = c;
        initComponents();
        this.setBounds(50, 50, 600, 630);
        ponerFecha("");
        this.setVisible(true);
        this.user = user;

        //Quito el boton de borrado para el Vendedor:
        String priv = user.getPrivilegio();
        if (priv.equals("e")) {

            s_nivel.setVisible(false);
            jLabel5.setVisible(false);
            combo_op.setEnabled(false);
            combo_a.setEnabled(false);
            combo_m.setEnabled(false);
            combo_d.setEnabled(false);
        }
        //*******************************************

        //Defino el tipo de Documento Predeterminado
        cb_documento.setSelectedIndex(0);


        //busqueda inicioal:
        String fecha = new java.sql.Date(System.currentTimeMillis()).toString();
        muestroBusqueda(fecha);


    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        bt_mostrar = new javax.swing.JButton();
        combo_op = new javax.swing.JComboBox();
        jLabel4 = new javax.swing.JLabel();
        lbl_total = new javax.swing.JLabel();
        b_nivel = new javax.swing.JButton();
        s_nivel = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        combo_d = new javax.swing.JComboBox();
        combo_m = new javax.swing.JComboBox();
        combo_a = new javax.swing.JComboBox();
        jButton1 = new javax.swing.JButton();
        cb_documento = new javax.swing.JComboBox();
        jLabel7 = new javax.swing.JLabel();
        lbl_total1 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        lbl_total2 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        jLabel10 = new javax.swing.JLabel();
        txt_separado = new javax.swing.JTextField();
        txt_caja = new javax.swing.JTextField();
        jLabel11 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        abonoTabla = new javax.swing.JTable();
        jLabel12 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        getContentPane().setLayout(null);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Mostrar Facturas", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 11), new java.awt.Color(0, 153, 153))); // NOI18N
        jPanel1.setLayout(null);

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel1.setForeground(new java.awt.Color(153, 153, 153));
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Año");
        jLabel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel1.add(jLabel1);
        jLabel1.setBounds(20, 20, 70, 20);

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel3.setForeground(new java.awt.Color(153, 153, 153));
        jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel3.setText("Mes");
        jLabel3.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel1.add(jLabel3);
        jLabel3.setBounds(90, 20, 100, 20);

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel2.setForeground(new java.awt.Color(153, 153, 153));
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("Dia");
        jLabel2.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel1.add(jLabel2);
        jLabel2.setBounds(190, 20, 60, 20);

        bt_mostrar.setText("Mostrar");
        bt_mostrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_mostrarActionPerformed(evt);
            }
        });
        jPanel1.add(bt_mostrar);
        bt_mostrar.setBounds(440, 20, 110, 30);

        combo_op.setBackground(new java.awt.Color(240, 240, 240));
        combo_op.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Detalle Factura", "Ventas del Dia", "Ventas  del Mes", "Ventas del Año", "Ventas Anuales" }));
        combo_op.setSelectedIndex(1);
        jPanel1.add(combo_op);
        combo_op.setBounds(270, 20, 160, 30);

        jLabel4.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel4.setForeground(new java.awt.Color(204, 102, 0));
        jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel4.setText("Ventas : ");
        jPanel1.add(jLabel4);
        jLabel4.setBounds(390, 380, 60, 20);

        lbl_total.setForeground(new java.awt.Color(255, 0, 51));
        lbl_total.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lbl_total.setText("0.00");
        lbl_total.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel1.add(lbl_total);
        lbl_total.setBounds(460, 380, 90, 20);

        b_nivel.setText("Bajar Nivel");
        b_nivel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                b_nivelActionPerformed(evt);
            }
        });
        jPanel1.add(b_nivel);
        b_nivel.setBounds(140, 80, 90, 30);

        s_nivel.setText("Subir Nivel");
        s_nivel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                s_nivelActionPerformed(evt);
            }
        });
        jPanel1.add(s_nivel);
        s_nivel.setBounds(50, 80, 90, 30);

        jLabel5.setFont(new java.awt.Font("Verdana", 1, 14));
        jLabel5.setForeground(new java.awt.Color(0, 153, 153));
        jLabel5.setText("<<");
        jPanel1.add(jLabel5);
        jLabel5.setBounds(20, 80, 34, 30);

        jLabel6.setFont(new java.awt.Font("Verdana", 1, 14));
        jLabel6.setForeground(new java.awt.Color(0, 153, 153));
        jLabel6.setText(">>");
        jPanel1.add(jLabel6);
        jLabel6.setBounds(230, 80, 34, 30);

        combo_d.setBackground(new java.awt.Color(240, 240, 240));
        combo_d.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31" }));
        combo_d.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                combo_dActionPerformed(evt);
            }
        });
        jPanel1.add(combo_d);
        combo_d.setBounds(190, 40, 60, 30);

        combo_m.setBackground(new java.awt.Color(240, 240, 240));
        combo_m.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" }));
        jPanel1.add(combo_m);
        combo_m.setBounds(90, 40, 100, 30);

        combo_a.setBackground(new java.awt.Color(240, 240, 240));
        combo_a.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020" }));
        jPanel1.add(combo_a);
        combo_a.setBounds(20, 40, 70, 30);

        jButton1.setText("Graficar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jPanel1.add(jButton1);
        jButton1.setBounds(440, 50, 110, 50);

        cb_documento.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Facturas y Notas Venta", "Notas Debito Credito" }));
        jPanel1.add(cb_documento);
        cb_documento.setBounds(270, 70, 160, 30);

        jLabel7.setText("Tipo de Documento:");
        jPanel1.add(jLabel7);
        jLabel7.setBounds(270, 50, 150, 20);

        lbl_total1.setForeground(new java.awt.Color(255, 0, 51));
        lbl_total1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbl_total1.setText("0.00");
        lbl_total1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel1.add(lbl_total1);
        lbl_total1.setBounds(320, 380, 70, 20);

        jLabel8.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel8.setForeground(new java.awt.Color(204, 102, 0));
        jLabel8.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel8.setText("IVA:");
        jPanel1.add(jLabel8);
        jLabel8.setBounds(280, 380, 40, 20);

        lbl_total2.setForeground(new java.awt.Color(255, 0, 51));
        lbl_total2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbl_total2.setText("0.00");
        lbl_total2.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel1.add(lbl_total2);
        lbl_total2.setBounds(220, 380, 70, 20);

        jLabel9.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel9.setForeground(new java.awt.Color(204, 102, 0));
        jLabel9.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel9.setText("Descuento:");
        jPanel1.add(jLabel9);
        jLabel9.setBounds(150, 380, 70, 20);

        jButton2.setText("Re-Imprimir");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        jPanel1.add(jButton2);
        jButton2.setBounds(20, 530, 120, 40);

        jLabel10.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel10.setForeground(new java.awt.Color(0, 102, 102));
        jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel10.setText("Separados y  Cuentas Cobradas :");
        jPanel1.add(jLabel10);
        jLabel10.setBounds(260, 510, 190, 20);

        txt_separado.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        txt_separado.setText("0.00");
        txt_separado.setEnabled(false);
        jPanel1.add(txt_separado);
        txt_separado.setBounds(460, 510, 90, 20);

        txt_caja.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        txt_caja.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        txt_caja.setText("0.00");
        txt_caja.setEnabled(false);
        jPanel1.add(txt_caja);
        txt_caja.setBounds(430, 540, 120, 28);

        jLabel11.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        jLabel11.setForeground(new java.awt.Color(255, 0, 0));
        jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel11.setText("Caja Final :");
        jPanel1.add(jLabel11);
        jLabel11.setBounds(330, 540, 90, 30);

        abonoTabla.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Separado/Deuda Codigo", "Resp | Observaciones", "Hora", "Valor"
            }
        ));
        abonoTabla.setEnabled(false);
        jScrollPane1.setViewportView(abonoTabla);

        jPanel1.add(jScrollPane1);
        jScrollPane1.setBounds(20, 420, 530, 90);

        jLabel12.setText("Abonos de Separados y Cuentas Cobradas:");
        jPanel1.add(jLabel12);
        jLabel12.setBounds(20, 400, 230, 20);

        getContentPane().add(jPanel1);
        jPanel1.setBounds(10, 10, 560, 580);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
// TODO add your handling code here:
        //System.out.println("El nivel es el siguiente:"+Nivel);
        if (Nivel >= 2) {
            Vent_graVerFact vgf = new Vent_graVerFact();

            String Periodo = "";
            String ejey = "";

            if (Nivel == 3) {
                Periodo = "Ano " + combo_a.getSelectedItem().toString();
                ejey = "meses";
            }
            if (Nivel == 4) {
                Periodo = "los Anos ";
                ejey = "anos";
            }
            if (Nivel == 2) {
                Periodo = "Mes " + combo_m.getSelectedItem().toString();
                ejey = "dias";
            }

            vgf.creaGrafProgres("Ventas de " + Periodo, "Valores", ejey, Color.black, Color.red, Color.gray, vgf.lblcha1, sacoData());
        } else {
            JOptionPane.showMessageDialog(this, "Solo se puede mostrar el progreso por Ano y Meses", "Informacion", JOptionPane.INFORMATION_MESSAGE);
        }

    }//GEN-LAST:event_jButton1ActionPerformed

    private void s_nivelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_s_nivelActionPerformed
// TODO add your handling code here:
        suboNivel();

    }//GEN-LAST:event_s_nivelActionPerformed

    public void suboNivel() {
        //System.out.println("subo nivel");
        int numeroCombo = combo_op.getItemCount() - 1;
        if (combo_op.getSelectedIndex() < numeroCombo) {
            int mes = combo_m.getSelectedIndex() + 1;
            String fecha = combo_a.getSelectedItem().toString() + "-" + mes + "-" + combo_d.getSelectedItem().toString();
            int combo = combo_op.getSelectedIndex();
            combo_op.setSelectedIndex(combo + 1);

            muestroBusqueda(fecha);

        }
    }

    private void b_nivelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_b_nivelActionPerformed
// TODO add your handling code here:
        if (Nivel > 0) {


            int seleccion = -1;
            try {
                seleccion = tabla.getSelectedRow();
                if (seleccion == -1) {
                    JOptionPane.showMessageDialog(this, "Tienes que seleccionar almenos Uno de la Lista", "Informacion", JOptionPane.INFORMATION_MESSAGE);
                }
            } catch (java.lang.NullPointerException e) {
                JOptionPane.showMessageDialog(this, "Tienes que seleccionar almenos Uno de la Lista", "Informacion", JOptionPane.INFORMATION_MESSAGE);
            }

            if (seleccion >= 0) {
                int nivelActual = combo_op.getSelectedIndex();
                combo_op.setSelectedIndex(nivelActual - 1);

                int fila = tabla.getSelectedRow();
                String fecha = tabla.getValueAt(fila, 0).toString();
                ponerFecha(fecha);
                muestroBusqueda(fecha);
            }

        }
    }//GEN-LAST:event_b_nivelActionPerformed
    public boolean esCombo(String cod) {
        boolean val = false;
        //Verifico si el Combo Existe.
        ResultSet resp;
        resp = conexion.consultarBase("select * from combo where cod_combo like '" + cod + "'");
        int filasIn = conexion.obtenerFilas(resp);
        if (filasIn > 0) {
            val = true;
        }

        return val;
    }

    public void actualizoBodegaF(String cod, int cant, int cant_ven) {
        cant = cant * cant_ven;

        //Actualizo Inventario Modificado productos:
        System.out.print(cod + " : ");
        conexion.insertarDatos("update itm_bodega set cantidad=cantidad+" + cant + " where cod_producto like '" + cod + "' and cod_bodega=" + bodega);
        conexion.insertarDatos("UPDATE producto SET stock_total=stock_total+" + cant + " where cod_producto like '" + cod + "'");
    }

    public void actualizoBodegaD(int codPed, String codPro, String codigoCombo, int cant, int cant_ven, String valor) {
        cant = cant * cant_ven;

        //Actualizo Inventario Modificado productos:
        System.out.print(codPro + " : ");
        //actualizo:
        conexion.insertarDatos("update itm_bodega set cantidad=cantidad+" + cant + " where cod_producto like '" + codPro + "' and cod_bodega=" + bodega);
        conexion.insertarDatos("UPDATE producto SET stock_total=stock_total+" + cant + " where cod_producto like '" + codPro + "'");
        conexion.insertarDatos("UPDATE pedido SET total_pagado=total_pagado-" + valor + " where cod_pedido=" + codPed + ";");
        conexion.insertarDatos("DELETE FROM dtl_pedido WHERE cod_producto='" + codigoCombo + "' and cod_pedido=" + codPed + ";");
    }

    public void ponerFecha(String fecha) {

        if (fecha.equals("")) {
            //Pongo la fecha del sistema    
            fecha = new java.sql.Date(System.currentTimeMillis()).toString();
            String[] s = fecha.split("-");
            combo_a.setSelectedItem(s[0]);
            combo_m.setSelectedIndex(Integer.parseInt(s[1]) - 1);
            combo_d.setSelectedIndex(Integer.parseInt(s[2]) - 1);
        } else {
            //Pongo la fecha a mi eleccion
            String[] s = fecha.split("-");
            combo_a.setSelectedItem(s[0]);
            combo_m.setSelectedIndex(Integer.parseInt(s[1]) - 1);
            combo_d.setSelectedIndex(Integer.parseInt(s[2]) - 1);


        }

    }

    public void muestroBusqueda(String fecha) {
        //Saco opcion de Documento:
        int seleccion = cb_documento.getSelectedIndex();
        String tablaDoc = "";
        String dimin = "";
        String terminal = "";
        String autorizacion = "";

        if (seleccion == 0) {
            tablaDoc = "pedido";
            dimin = "pe";
            terminal = "cod_terminal";
            autorizacion = "num_autorizacion";
        } else if (seleccion == 1) {
            tablaDoc = "nota";
            dimin = "no";
            terminal = "terminal";
            autorizacion = "autorizacion";
        }


        int opcionBusqueda = combo_op.getSelectedIndex();
        //System.out.println("La Opcion es: "+opcionBusqueda);
        ResultSet respuesta = null;
        ResultSet respSeparado = null;
        ResultSet respCuentasCobradas = null;

        boolean muestroDet = false;

        switch (opcionBusqueda) {
            case 0:
                if (Nivel != 1) {
                    JOptionPane.showMessageDialog(this, "Tienes que seleccionar una Factura para ver el Detalle", "Informacion", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    muestroDetalleFac(tablaDoc, dimin);
                    muestroDet = true;
                }

                break;
            case 1://Dias
                //System.out.println("SELECT fecha_"+dimin+" as 'FECHA',cod_"+tablaDoc+" as 'Codigo',tipo_comprobante as 'Tipo',"+terminal+" as 'Terminal',"+autorizacion+" as 'AutoNum',descuento,(totalNeto-descuento)*(iva/100) as 'IVA',total_pagado as 'Total' FROM "+tablaDoc+" p where fecha_"+dimin+"='"+fecha+"' and estato_"+dimin+" like 'A';");
                respuesta = conexion.consultarBase("select fecha_" + dimin + " AS 'FECHA',cod_" + tablaDoc + " as 'CODIGO',tipo_comprobante as 'TIPO'," + terminal + " as 'Terminal'," + autorizacion + " as 'AUTONUM',descuento,round(((totalNeto-descuento)*(iva/100)),2) as 'IVA',total_pagado as 'TOTAL'  from " + tablaDoc + " p where fecha_" + dimin + "='" + fecha + "' and estato_" + dimin + " like 'A' ;");
                respSeparado = conexion.consultarBase("SELECT sum(valor) FROM pago_separado  where fecha='" + fecha + "' ;");
                respCuentasCobradas = conexion.consultarBase("SELECT sum(valor) FROM pagoscc where fecha='" + fecha + "';");
                llenoSeparadosTabla();
                pongoSeparado(respSeparado, respCuentasCobradas);
                break;
            case 2: // Semana

                //System.out.println("Por Semana ");
                //System.out.println("SELECT fecha_"+dimin+" as Semanas, DAYNAME(fecha_"+dimin+") as Dia,sum(descuento) as DESCUENTO,SUM(round(((totalNeto-descuento)*(iva/100)),2)) as 'IVA', SUM(total_pagado) as VALOR  FROM "+tablaDoc+"  where Month(fecha_"+dimin+")= Month('"+fecha+"') and year(fecha_"+dimin+")= year('"+fecha+"') and estato_"+dimin+" like 'A'  GROUP BY fecha_"+dimin+" order by fecha_"+dimin+";");
                respuesta = conexion.consultarBase("SELECT fecha_" + dimin + " as Semanas, DAYNAME(fecha_" + dimin + ") as Dia,sum(descuento) as DESCUENTO,SUM(round(((totalNeto-descuento)*(iva/100)),2)) as 'IVA', SUM(total_pagado) as VALOR  FROM " + tablaDoc + "  where Month(fecha_" + dimin + ")= Month('" + fecha + "') and year(fecha_" + dimin + ")= year('" + fecha + "') and estato_" + dimin + " like 'A'  GROUP BY fecha_" + dimin + " order by fecha_" + dimin + ";");
                respSeparado = conexion.consultarBase("SELECT sum(valor) FROM pago_separado where Month(fecha)= Month('" + fecha + "') and year(fecha)= year('" + fecha + "') ;");
                respCuentasCobradas = conexion.consultarBase("SELECT sum(valor) FROM pagoscc where Month(fecha)= Month('" + fecha + "') and year(fecha)= year('" + fecha + "') ;");
                limpioSepara();
                pongoSeparado(respSeparado, respCuentasCobradas);

                break;
            case 3: // Mes
                //System.out.println("Por Mes");
                //System.out.println("SELECT fecha_"+dimin+" as Mes, MONTHNAME(fecha_"+dimin+") as Dia,sum(descuento) as DESCUENTO,SUM(round(((totalNeto-descuento)*(iva/100)),2)) as 'IVA', SUM(total_pagado) as VALOR  FROM "+tablaDoc+"  where year(fecha_"+dimin+")= year('"+fecha+"') and estato_"+dimin+" like 'A'  GROUP BY Month(fecha_"+dimin+") order by fecha_"+dimin+";");
                respuesta = conexion.consultarBase("SELECT fecha_" + dimin + " as Mes, MONTHNAME(fecha_" + dimin + ") as Mes,sum(descuento) as DESCUENTO,SUM(round(((totalNeto-descuento)*(iva/100)),2)) as 'IVA', SUM(total_pagado) as VALOR  FROM " + tablaDoc + "  where year(fecha_" + dimin + ")= year('" + fecha + "') and estato_" + dimin + " like 'A'  GROUP BY Month(fecha_" + dimin + ") order by fecha_" + dimin + ";");
                respSeparado = conexion.consultarBase("SELECT sum(valor) FROM pago_separado where year(fecha)= year('" + fecha + "') ;");
                respCuentasCobradas = conexion.consultarBase("SELECT sum(valor) FROM pagoscc where year(fecha)= year('" + fecha + "') ;");
                limpioSepara();
                pongoSeparado(respSeparado, respCuentasCobradas);

                break;

            case 4: // Anos
                //System.out.println("Por Anos");
                //System.out.println("SELECT fecha_"+dimin+", year(fecha_"+dimin+") as Dia,sum(descuento) as DESCUENTO,SUM(round(((totalNeto-descuento)*(iva/100)),2)) as 'IVA', SUM(total_pagado) as VALOR  FROM "+tablaDoc+" where estato_"+dimin+" like 'A'   GROUP BY year(fecha_"+dimin+") order by fecha_"+dimin+";");
                respuesta = conexion.consultarBase("SELECT fecha_" + dimin + " as Fecha, year(fecha_" + dimin + ") as Ano,sum(descuento) as DESCUENTO,SUM(round(((totalNeto-descuento)*(iva/100)),2)) as 'IVA', SUM(total_pagado) as VALOR  FROM " + tablaDoc + " where estato_" + dimin + " like 'A' GROUP BY year(fecha_" + dimin + ") order by fecha_" + dimin + ";");
                respSeparado = conexion.consultarBase("SELECT sum(valor) FROM pago_separado ;");
                respCuentasCobradas = conexion.consultarBase("SELECT sum(valor) FROM pagoscc  ;");
                limpioSepara();
                pongoSeparado(respSeparado, respCuentasCobradas);

                break;




        }



        //Cambio el Nivel
        Nivel = opcionBusqueda;
        //System.out.println("El nivel Actual esss:::::::::::"+Nivel);

        if (!muestroDet) {

            //Obtengo Filas-Arreglo de Titulos de Columnas
            int filas = conexion.obtenerFilas(respuesta);
            String[] titulosCol = conexion.obtenerColumnas(respuesta);

            //Creo la tabla:

            CrearTabla(filas, titulosCol);
            llenaTabla(respuesta, titulosCol.length, filas);
            actualizoTotal();
            // bt_mostrar.setText("Nueva Busqueda");
        }

    }

    public void pongoSeparado(ResultSet respU, ResultSet respC) {
        int numero = conexion.obtenerFilas(respU);
        double separado = 0;
        double cuentas = 0;

        if (numero == 0) {
            separado = 0;
        } else {
            try {
                respU.beforeFirst();
                respU.next();
                separado = respU.getDouble(1);
            } catch (SQLException ex) {
                Logger.getLogger(VerFacturas.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        //Pongo el valor del separado
        this.txt_separado.setText(nf.format(Double.valueOf(separado)).replaceAll(",", "."));


        //Pongo el Valor recibido por los fiados:
        numero = conexion.obtenerFilas(respC);
        cuentas = 0;

        if (numero == 0) {
            cuentas = 0;
        } else {
            try {
                respC.beforeFirst();
                respC.next();
                cuentas = respC.getDouble(1);
            } catch (SQLException ex) {
                Logger.getLogger(VerFacturas.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        //Pongo el valor del separado
        double total = cuentas + separado;
        this.txt_separado.setText(nf.format(Double.valueOf(total)).replaceAll(",", "."));

    }

    public void limpioSepara() {

        //Limpio Tabla
        int filas = abonoTabla.getRowCount();
        int cont = 0;
        while (cont < filas) {
            try {
                for (int i = 0; i < 6; i++) {
                    //System.out.println("valor fila:"+cont+" columnas: "+i);
                    abonoTabla.setValueAt(null, cont, i);
                    ////System.out.println(toma);
                }
            } catch (Exception e) {
            };
            cont++;
        }


    }

    public void llenoSeparadosTabla() {
        //Lleno la tabla de Separados:combo_m.getSelectedIndex()+1
        int mes = combo_m.getSelectedIndex() + 1;
        String fecha = combo_a.getSelectedItem().toString() + "-" + mes + "-" + combo_d.getSelectedItem().toString();
        ResultSet respuesta = conexion.consultarBase("SELECT cod_separado,responsable,hora,valor FROM pago_separado p where fecha='" + fecha + "';");
        limpioSepara();
        try {
            respuesta.beforeFirst();
            int contador = 0;
            abonoTabla.removeAll();

            while (respuesta.next()) {
                int codigoSepara = 0;
                String responsableSep = "";
                Time tiempo;
                double valorSepara = 0;

                codigoSepara = respuesta.getInt(1);
                responsableSep = respuesta.getString(2);
                tiempo = respuesta.getTime(3);
                valorSepara = respuesta.getDouble(4);
                abonoTabla.setValueAt(codigoSepara, contador, 0);
                responsableSep = responsableSep + "Abono Separado";
                abonoTabla.setValueAt(responsableSep, contador, 1);
                abonoTabla.setValueAt(tiempo, contador, 2);
                abonoTabla.setValueAt(valorSepara, contador, 3);

                contador++;
            }

        } catch (SQLException ex) {
            Logger.getLogger(VerFacturas.class.getName()).log(Level.SEVERE, null, ex);
        }



        //Lleno la tabla de Abonos x Deudas:

        respuesta = conexion.consultarBase("SELECT cod_pagos,responsable,hora,valor FROM pagoscc p where fecha='" + fecha + "';");

        try {
            respuesta.beforeFirst();
            int contador = 0;


            while (respuesta.next()) {
                int codigoSepara = 0;
                String responsableSep = "";
                Time tiempo;
                double valorSepara = 0;

                codigoSepara = respuesta.getInt(1);
                responsableSep = respuesta.getString(2);
                tiempo = respuesta.getTime(3);
                valorSepara = respuesta.getDouble(4);
                abonoTabla.setValueAt(codigoSepara, contador, 0);
                responsableSep = responsableSep + " Abono Deuda";
                abonoTabla.setValueAt(responsableSep, contador, 1);
                abonoTabla.setValueAt(tiempo, contador, 2);
                abonoTabla.setValueAt(valorSepara, contador, 3);

                contador++;
            }

        } catch (SQLException ex) {
            Logger.getLogger(VerFacturas.class.getName()).log(Level.SEVERE, null, ex);
        }


    }

    public void muestroDetalleFac(String tablaDoc, String dimin) {
        int seleccion = tabla.getSelectedRow();
        //System.out.println("La fila seleccionada es:"+seleccion);
        //Quito el valor del Separado:
        txt_separado.setText("0.00");
        this.limpioSepara();

        //Esta en DIAS Muestro Detalle:
        int cod_pedido = Integer.parseInt(tabla.getValueAt(seleccion, 1).toString());
        ////System.out.println("El codigo del pedido es:"+cod_pedido);


        ResultSet respuesta = null;
        respuesta = conexion.consultarBase("SELECT d.cod_" + tablaDoc + " as '" + tablaDoc + "',p.cod_producto as 'Codigo' ,p.nombre as 'Nombre',d.cantidad as 'Cant',d.subtotal as 'Subtotal'"
                + " FROM dtl_" + tablaDoc + " d,producto p where d.cod_producto=p.cod_producto and d.cod_" + tablaDoc + "='" + cod_pedido + "';");
        //Obtengo Filas-Arreglo de Titulos de Columnas
        int filas = conexion.obtenerFilas(respuesta);
        String[] titulosCol = conexion.obtenerColumnas(respuesta);

        //Creo la tabla:

        CrearTabla(filas, titulosCol);
        llenaTabla(respuesta, titulosCol.length, filas);
        actualizoTotal();

        //Obtengo el Total:
        double total = 0;
        respuesta = conexion.consultarBase("SELECT p.total_pagado FROM " + tablaDoc + " p where p.cod_" + tablaDoc + "=" + cod_pedido + ";");
        try {
            respuesta.beforeFirst();
            respuesta.next();
            total = respuesta.getDouble(1);
            //System.out.println("El valor del Double Obtenido es:::::::::::::"+total);
        } catch (java.sql.SQLException e) {
            System.out.print("Error al convertir el valor a double");
        }
        lbl_total.setText("");
        lbl_total.setText(String.valueOf(total));


    }

    private void bt_mostrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_mostrarActionPerformed
// TODO add your handling code here:
        //Busca segun la fecha:
        int mes = combo_m.getSelectedIndex() + 1;
        String fecha = combo_a.getSelectedItem().toString() + "-" + mes + "-" + combo_d.getSelectedItem().toString();
        int combo = combo_op.getSelectedIndex();
        //System.out.println("La fecha es: "+fecha);
        muestroBusqueda(fecha);


    }//GEN-LAST:event_bt_mostrarActionPerformed
    public void llenaTabla(ResultSet r, int columnas, int filas) {
        try {
            r.beforeFirst();

            int j = 0;
            while (r.next()) {


                for (int i = 0; i < columnas; i++) {

                    Object toma = r.getObject(i + 1);
                    //System.out.println("toma valor:"+toma+" * fila:"+j+" * column:"+i);
                    try {
                        tabla.setValueAt(toma, j, i);
                    } catch (java.lang.ArrayStoreException e) {
                        tabla.setValueAt("null", j, i);
                    }
                }

                j++;
            }
        } catch (SQLException sqle) {
            //System.out.println("Error al mostrar los datos");
            System.err.println(sqle);
        }

    }

    public void CrearTabla(int filas, String[] titulos) {
        int columnas = 0;
        try {
            columnas = titulos.length;
        } catch (Exception e) {
            //System.out.println("El numero de columnas es cero");
        }
        String[][] tabla0 = new String[filas][columnas];

        tabla = new JTable(tabla0, titulos);

        //Aqui le especifico para que la tabla acepte valores doubles e int:
        //--------------------------------------------------------------------
        final boolean[] canEdit = new boolean[columnas];
        for (int p = 0; p < columnas; p++) {
            canEdit[p] = false;
        }
        tabla.setModel(new javax.swing.table.DefaultTableModel(
                tabla0, titulos) {
            // boolean[] canEdit = new boolean [] { false, false, false, false};
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit[columnIndex];
            }
        });
        //---------------------------------------------------------------------

        //remuevo el JScroll para que no se monte cuando cree el nuevo:
        //*************************************************************
        try {
            jPanel1.remove(js);
        } catch (java.lang.NullPointerException e) {
        }
        //*************************************************************

        //Pongo en la tabla:
        js = new JScrollPane(tabla);

        js.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(198, 196, 196)));
        js.setBounds(22, 120, 530, 260);
        js.setVisible(true);
        jPanel1.add(js);
        js.updateUI();
    }

    public void actualizoTotal() {

        ////System.out.println("Entra en actualiza");
        int numeroFilas = tabla.getRowCount();
        int numeroCol = tabla.getColumnCount();
        int cont = 0;
        double acumulaTotal = 0;
        double acumulaDesc = 0;
        double acumulaIva = 0;
        String toma;
        //System.out.println("**********Cuenta*********************");
        //Muestro Los Subtotales:
        while (cont < numeroFilas) {

            try {
                //Acumula Total:
                toma = tabla.getValueAt(cont, numeroCol - 1).toString();
                //System.out.println("Acumula="+acumulaTotal);
                acumulaTotal = acumulaTotal + Double.parseDouble(toma);
                //Acumula Iva:
                toma = tabla.getValueAt(cont, numeroCol - 2).toString();
                //System.out.println("Acumula="+acumulaIva);
                acumulaIva = acumulaIva + Double.parseDouble(toma);
                //Acumula Descuento
                toma = tabla.getValueAt(cont, numeroCol - 3).toString();
                //System.out.println("Acumula="+acumulaDesc);
                acumulaDesc = acumulaDesc + Double.parseDouble(toma);

            } catch (Exception e) {
                System.err.println("error je" + e);
            };
            //System.out.println("Acumula="+acumulaTotal);

            cont++;
        }
        //System.out.println("*******************************");

        lbl_total.setText(nf.format(Double.valueOf(acumulaTotal)).replaceAll(",", "."));
        lbl_total1.setText(nf.format(Double.valueOf(acumulaIva)).replaceAll(",", "."));
        lbl_total2.setText(nf.format(Double.valueOf(acumulaDesc)).replaceAll(",", "."));

        double caja = Double.valueOf(lbl_total.getText()) + Double.valueOf(txt_separado.getText());
        this.txt_caja.setText(nf.format(Double.valueOf(caja)).replaceAll(",", "."));

    }

    public void creaGrafProgres(String titulo, String ejex, String ejey, Color fondo_Color, Color titulo_Color, Color tapiz, javax.swing.JLabel lbl_etiqueta, TimeSeries pop) {
        //Crea un Grafico3D de Barras:
        //Especifica los datos a crear en un dataset.
        // Create a time series chart 
        TimeSeriesCollection dataset = new TimeSeriesCollection();
        dataset.addSeries(pop);


        JFreeChart chart = ChartFactory.createTimeSeriesChart(
                titulo, //Title
                ejey, //etiqueta eje x
                ejex, //etiqueta eje y
                dataset, //Dataset
                false, //Muestra Leyenda
                true, //Usa tooltips
                false //Configura el chart para generar URLS?
                );

        //Le guarda  a la grafica como una imagen JPG:
//        try {
//            ChartUtilities.saveChartAsJPEG(new File("C:\\chart.jpg"), chart, 610, 150);
//        } catch (Exception e) {
//           //System.out.println("Problem occurred creating chart.");
//        }
        //Cambio presentacion de los ejes de fechas:
//        XYPlot plot = chart.getXYPlot();
//        DateAxis axis = (DateAxis) plot.getDomainAxis();
//        axis.setDateFormatOverride(new SimpleDateFormat("dd-MM-yyyy"));


        //Personaliso:
        chart.setBackgroundPaint(tapiz); // Color Fondo 
        chart.getTitle().setPaint(titulo_Color); // Color Titulo Color.blue
//       CategoryPlot pc = chart.getCategoryPlot(); // Toma el objeto plot para un grafico de barra
//       pc.setBackgroundPaint(fondo_Color); // Modifica el Fondo del PlotColor.black
//       pc.setRangeGridlinePaint(Color.red); //Modifica el Color lineas Grilla

        //Carga la imagen Generada en un Label:


        //Creo un bufer de imagenes y le pongo en una etiqueta
        BufferedImage image = chart.createBufferedImage(680, 380);
        lbl_etiqueta.setIcon(new ImageIcon(image));
        setVisible(true);


    }

    public TimeSeries sacoData() {
        // Create a time series chart
        TimeSeries pop = new TimeSeries("Ventas Realizadas", Day.class);

        for (int i = 0; i < tabla.getRowCount(); i++) {
            String fecha[] = tabla.getValueAt(i, 0).toString().split("-");

            double valor = Double.valueOf(tabla.getValueAt(i, tabla.getColumnCount() - 1).toString());
            //System.out.println("La fecha que grafica es"+fecha[0]+fecha[1]+fecha[2]);
            //System.out.println("los items son:"+pop.getItemCount());
            Day dia = new Day(Integer.parseInt(fecha[2]), Integer.parseInt(fecha[1]), Integer.parseInt(fecha[0]));

            pop.add(dia, valor);

        }
        return pop;
    }

    private void combo_dActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_combo_dActionPerformed
// TODO add your handling code here:
    }//GEN-LAST:event_combo_dActionPerformed

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
// TODO add your handling code here:
    int fila = tabla.getSelectedRow();
    if (fila >= 0) {
        String cod_factura = tabla.getValueAt(fila, 1).toString();
        String tipoDoc = tabla.getValueAt(fila, 2).toString();
        String path = "facturas/";
        if (tipoDoc.equals("F")) {
            path = path + "Factura_" + cod_factura + ".txt";
        } else if (tipoDoc.equals("N")) {
            path = path + "Nota de Venta_" + cod_factura + ".txt";
        } else if (tipoDoc.equals("C")) {
            path = path + "Nota de Credito_" + cod_factura + ".txt";
        } else if (tipoDoc.equals("D")) {
            path = path + "Nota de Debito_" + cod_factura + ".txt";
        }
        //System.out.println(path);
        Imprimir p = new Imprimir();

        String Etiqueta = "\nBLANCO : ADQUIRIENTE \n"
                + "COLOR  : EMISOR      \n\n\n\n\n\n\n";

        //Reemplazo el texto que dice copia por el nuevo texto del archivo
        Archivo archivo = new Archivo(path);
        
        //Si no existe el archivo fisico genera una factura desde la base:
        if (!archivo.sacoFile().exists()) {
            

            ResultSet result = conexion.consultarBase("SELECT * FROM "
                    + "bdmultiadmin.pedido as p, bdmultiadmin.dtl_pedido as d,cliente as c,bodega b  "
                    + "where p.cod_cliente=c.cod_cliente "
                    + "and p.cod_bodega=b.cod_bodega "
                    + "and d.cod_pedido=p.cod_pedido "
                    + "and tipo_comprobante='F' "
                    + "and p.cod_pedido=" + cod_factura + ";");
            try {
                result.beforeFirst();

                Imprimir trabImpresion = null;
                int n = 0;
                while (result.next()) {

                    if (n == 0) {
                        //Cargo la cabecera de la impresion:
                        trabImpresion = new Imprimir(
                                String.valueOf(bodega),
                                result.getString(19),
                                result.getString(1),
                                result.getString(2),
                                result.getString(33)+" "+result.getString(34),
                                result.getString(39),
                                "direccion",
                                "Factura",
                                result.getString(52),
                                "CARLOS SILVA",
                                "RUC",
                                "Local Sexylocuras",
                                "AUTORIZACION",
                                result.getString(4),
                                result.getString(4),
                                result.getString(23));

                        trabImpresion.escriboFact(trabImpresion.pongoTitulos(""));

                        //
                        n++;
                    }

                    //Inserto Detalles:
                    trabImpresion.insertoDetImp(
                            result.getString(25),//codProd
                            result.getString(29),//nombre
                            result.getString(26),//Cantidad
                            String.valueOf(Double.valueOf(result.getString(27)) / Double.valueOf(result.getString(26))),//precio
                            result.getString(27));//Subtotal


                    //
                    if (result.isLast()) {


                        double subDespDesct = Double.valueOf(result.getString(13)) - Double.valueOf(result.getString(12));
                        String iva = "0";
                        if (!result.getString(11).equals("0")) {
                            double ivaValor = (subDespDesct * Double.valueOf(result.getString(11))) / 100;
                            iva=nf.format(ivaValor).replaceAll(",",".");
                        }

                        String Pie = trabImpresion.pieFactura(
                                result.getString(13),//subtotal
                                result.getString(12),//descuento
                                iva,//iva
                                result.getString(10));//total

                        trabImpresion.escriboFact(Pie);


                        //Introdusco el Original.
                        String otra = "\nBLANCO : ADQUIRIENTE \n"
                                + "COLOR  : EMISOR      \n\n\n\n\n\n\n";
                        trabImpresion.escriboFact(otra);


                    }

                }



            } catch (SQLException ex) {
                Logger.getLogger(VerFacturas.class.getName()).log(Level.SEVERE, null, ex);
            }

        
        }else{
                archivo.removeLineFromFile(path, "BLANCO : ADQUIRIENTE ", "Copia sin Derecho a Credito Tributario");
                archivo.removeLineFromFile(path, "COLOR  : EMISOR      ", "");
        }

        //Realizo la Re Impresion
        p.realizaReImprecion(path);

        //Regreso al Estado Inicial:
        archivo.removeLineFromFile(path, "Copia sin Derecho a Credito Tributario", "BLANCO : ADQUIRIENTE |COLOR  : EMISOR      ");





    } else {
        JOptionPane.showMessageDialog(this, "Tiene que seleccionar un Comprobante para comenzar la Impresion.", "Informacion", JOptionPane.INFORMATION_MESSAGE);
    }
}//GEN-LAST:event_jButton2ActionPerformed
    /**
     * @param args the command line arguments
     */
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTable abonoTabla;
    private javax.swing.JButton b_nivel;
    private javax.swing.JButton bt_mostrar;
    private javax.swing.JComboBox cb_documento;
    private javax.swing.JComboBox combo_a;
    private javax.swing.JComboBox combo_d;
    private javax.swing.JComboBox combo_m;
    private javax.swing.JComboBox combo_op;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel lbl_total;
    private javax.swing.JLabel lbl_total1;
    private javax.swing.JLabel lbl_total2;
    private javax.swing.JButton s_nivel;
    private javax.swing.JTextField txt_caja;
    private javax.swing.JTextField txt_separado;
    // End of variables declaration//GEN-END:variables
}
